     <h1 class="entry-title entry-title-single" itemprop="headline">ABAP 开发系列(06): ABAP 控制语句</h1>

    <div class="entry-content entry-content-single entry-content-aside" itemprop="text">
      <h2>3. 控制语句</h2>
<p>对<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap-abap" title="ABAP" target="_blank">ABAP</a></span>语言的掌握到一定程序后，会处理一些复杂的内容，而<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap" title="SAP" target="_blank">SAP</a></span>的数据流控制中，更有很多复杂的逻辑操作。</p>
<p>这时候需要一些手段来管理和组织这些项目，<span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/sap-abap" title="ABAP" target="_blank">ABAP</a></span>的分支结构，如 <b>if，case</b>；循环操作，如 <b>Do，While</b> 等。</p>
<p>以便程序按照所需要的逻辑处理相应的任务。</p>
<p>&nbsp;<br />
<span id="more-247"></span></p>
<p><b>3.1 <span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/if" title="查看IF中的全部文章" target="_blank">IF</a></span></b><b>语句</b></p>
<p>先看下 <span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/if" title="查看IF中的全部文章" target="_blank">IF</a></span> 语句的例子：</p>
<pre class="brush: abap;">
DATA:  X  TYPE I VALUE 5.

IF X =5.
  
  WRITE :/ ‘The value of X is 5’.

ELSE.

  WRITE :/ ‘The value of X is no 5’.

ENDIF.

</pre>
<p>&nbsp;</p>
<p>在定义变量 X 时，将其默认值设为 5。</p>
<p>在 <strong><span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/if" title="查看IF中的全部文章" target="_blank">IF</a></span> 语句</strong>中，进行判断，当 X = 5 时，为<b>真(True)</b>，则输出 X 的值为 5；</p>
<p>如若把 <strong>X</strong> 的改成其他值，判断的结果为<b>假 (False)</b>，所以执行 <b>ELSE</b> 中的语句，输出 X 的值不为 5。</p>
<p>&nbsp;</p>
<p><strong>IF 语句</strong>被称为<b>分支结构</b> 或 <b>选择语句</b>，因为它提供了一个交汇点，可以选择两个分支中的一个。</p>
<p>IF 语句的通用形式：</p>
<p><b style="color:red;">IF &lt;表达式&gt;.</b></p>
<p><b style="color:red;padding-left:20px;">语句1 …</b></p>
<p><b style="color:red;">ELSE.</b></p>
<p><b style="color:red;padding-left:20px;">语句2 …</b></p>
<p><b style="color:red;">ENDIF.</b></p>
<p>如果表达式为<b>真 (True)</b>，则执行语句1， 如果为<b>假 (False)</b>，则执行语句2.</p>
<p>&nbsp;</p>
<p>如若出现两个选择以上时，可以使用嵌套的 IF语句:</p>
<p><b style="color:red;">IF  &lt;表达式1&gt;.</b></p>
<p><b style="color:red; padding-left:20px;">语句1 …</b></p>
<p><b style="color:red;">ELSEIF  &lt;表达式2&gt;.</b></p>
<p><b style="color:red; padding-left:20px;">语句2 …</b></p>
<p><b style="color:red;">ELSE.</b></p>
<p><b style="color:red; padding-left:20px;">语句3 …</b></p>
<p><b style="color:red;">ENDIF.</b></p>
<p>&nbsp;</p>
<p>其中，<b style="color:red;">ELSEIF</b> 为<strong>多重选择语句</strong>，用于适应不同的分支选择。</p>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>3.2 </b><b>逻辑表达式</b></p>
<p>在 IF语句中，重点在于 if 中的判断，也就是表达式的操作。</p>
<p>而逻辑表达式，主要由以下几类组成：</p>
<p><strong>1.关系操作符</strong></p>
<p><strong>2.逻辑操作符</strong></p>
<p>&nbsp;</p>
<p><b>3.2.1 </b><b>关系操作符</b></p>
<p>ABAP中的关系运算符如下所示：</p>
<table width="60%" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="144"><b>描 述</b></td>
<td valign="top" width="144"><b>语 法</b></td>
</tr>
<tr>
<td valign="top" width="144">等于(Is Equal to)</td>
<td valign="top" width="144">=, EQ</td>
</tr>
<tr>
<td valign="top" width="144">不等于(Is not equal to)</td>
<td valign="top" width="144">&lt;&gt;, &gt;&lt;, NE</td>
</tr>
<tr>
<td valign="top" width="144">大于(Greater than) </td>
<td valign="top" width="144">&gt;, GT</td>
</tr>
<tr>
<td valign="top" width="144">大于等于(Greater than or equal to)</td>
<td valign="top" width="144">&gt;=, =&gt; , GE</td>
</tr>
<tr>
<td valign="top" width="144">小于(Less than) </td>
<td valign="top" width="144">&lt;, LT</td>
</tr>
<tr>
<td valign="top" width="144">小于等于(Less than or equal to)</td>
<td valign="top" width="144">&lt;=, =&lt;, LE</td>
</tr>
</table>
<p>其中，字符 <strong>EQ、GT</strong> 等也可作为关系运算操作。</p>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>3.2.2 </b><b>逻辑操作符</b></p>
<p>逻辑操作符只有 <strong>AND</strong> 和 <strong>OR</strong> 两种。</p>
<p>AND： 和/并 操作</p>
<p>OR：  或 操作</p>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>3.2.3 </b><b>操作符优先级</b></p>
<p>在条件判断时，往往关系操作符和逻辑操作符会组合在一起，这时就会存在有优先级的处理。</p>
<p>逻辑操作符的优先级低于关系操作符,逻辑操作符中 AND 的优先级要比OR的高，而这两者的优先级都比赋值运算的高。</p>
<p>比如：</p>
<p>a &gt; b <strong>AND</strong> c &lt; d  <strong>OR</strong> b &gt; d</p>
<p>可以看成：</p>
<p>( ( a &gt; b )  <strong>AND</strong> ( c &lt; d)  ) <strong>OR</strong> ( b &gt; d )</p>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>3.3  多重选择：<span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/case" title="查看CASE中的全部文章" target="_blank">CASE</a></span> 语句</b></p>
<p>使用条件运算符和if语句可以很快编写从两个选择中进行选择的程序。</p>
<p>但当出现多个选择的时候，可以通过 <strong>IF … ELSEIF … ELSE… ENDIF.</strong> 语句来完成。</p>
<p>如若出现3种或3种以上选择时，使用 <strong><span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/case" title="查看CASE中的全部文章" target="_blank">CASE</a></span>… END<span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/case" title="查看CASE中的全部文章" target="_blank">CASE</a></span>.</strong> 语句会更为方便：</p>
<pre class="brush: abap;">

* CASE 语句
CASE sy-ucomm.
   WHEN ‘SAVE’.
           …
   WHEN ‘SRTA’.
       …
   WHEN ‘SRTD’.
      …
   WHEN ‘GETD’.
     …
   WHEN OTHERS.
     …
END CASE.

</pre>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>3.4 </b><b>循环操作：Do</b><b>、While</b><b>语句</b></p>
<p><b>3.4.1 Do</b><b>语句</b></p>
<p>Do语句形式：</p>
<p><b style="color:red;"><span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/do" title="查看DO中的全部文章" target="_blank">DO</a></span>  X  TIMES.</b></p>
<p><b style="color:red; padding-left:20px;">…</b></p>
<p><b style="color:red;">END <span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/do" title="查看DO中的全部文章" target="_blank">DO</a></span>.</b></p>
<p>&nbsp;</p>
<p>通过设置 <strong>TIMES</strong> 的值来指定循环次数：</p>
<pre class="brush: abap;">
J = 4.
DO J TIMES.

   WRITE :/ ‘Hello world!’.

ENDDO.
</pre>
<p>&nbsp;</p>
<p><strong>注意的是</strong>:使用Do语句时，切勿不能进入死循环：</p>
<pre class="brush: abap;">
DO.

   WRITE :/ ‘Hello world!’.

ENDDO.
</pre>
<p>以上程序语法可以通过，但会陷入死循环，这样会致使程序死掉。</p>
<p>所以在操作时，应细心慎重，避免出现这类错误，程序陷入死循环时可大可小，严重时甚至会导致整个系统崩溃。</p>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>3.4.2 While</b><b>语句</b></p>
<p><span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/while" title="查看WHILE中的全部文章" target="_blank">WHILE</a></span>循环是一个入口条件循环的语句，必须在进入循环前检查判断并返回结果。</p>
<p>只有条件为<strong>真(True)</strong>时，才会进入循环体内操作；</p>
<p>如果为<strong>假(False)</strong>则会直接跳过 <strong>END<span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/while" title="查看WHILE中的全部文章" target="_blank">WHILE</a></span></strong> 后面，不会执行循环体。</p>
<p>&nbsp;</p>
<p><strong>WHILE语句</strong>格式：</p>
<p><b style="color:red;">WHILE &lt;表达式&gt;</b></p>
<p><b style="color:red; padding-left:20px;">…</b></p>
<p><b style="color:red;">ENDWHILE.</b></p>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>3.4.3  </b><b>嵌套循环</b></p>
<p>在 <strong><span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/do" title="查看DO中的全部文章" target="_blank">DO</a></span></strong> 和 <strong>WHILE</strong> 之间都可以嵌套循环操作。</p>
<p>不过，为避免性能消耗，一般超过3层的嵌套，就要考虑优化程序。</p>
<p>以下是两层嵌套的简单例子：</p>
<pre class="brush: abap;">
DO 2 TIMES.

  WRITE : / SY-INDEX.

  DO 3 TIMES.

    WRITE :  / ‘    ‘, SY-INDEX.

  ENDDO.

ENDDO. 

</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><b>3.4.4 </b><b>循环助手：<span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/continue" title="查看CONTINUE中的全部文章" target="_blank">CONTINUE</a></span></b><b>、<span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/exit" title="查看EXIT中的全部文章" target="_blank">EXIT</a></span></b><b>语句</b></p>
<p><b>1. <span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/continue" title="查看CONTINUE中的全部文章" target="_blank">CONTINUE</a></span></b><b>语句</b></p>
<p>一般来说，进入循环体后，在下次循环判断之前，会执行完循环体内所有程序。</p>
<p>而 <strong><span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/continue" title="查看CONTINUE中的全部文章" target="_blank">CONTINUE</a></span>语句</strong>可以在循环过程中，根据判断结果，忽略部分程序，直接进入下次循环，甚至终止。</p>
<pre class="brush: abap;">

DO 10 TIMES.

  IF SY-INDEX > 4.

    CONTINUE .

  ENDIF.

  WRITE :/ SY-INDEX.

ENDDO.

</pre>
<p>上面程序中，当循环到第4次之后，才会输出 <strong>sy-tabix</strong> 的值。</p>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>2. <span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/exit" title="查看EXIT中的全部文章" target="_blank">EXIT</a></span></b><b>语句</b></p>
<p><strong>EXIT语句</strong>的作用和<strong>CONTINUE语句</strong>相似，只是不同的是：</p>
<p><strong>CONTINUE语句</strong>在循环过程中，可以进入下次循环</p>
<p>而<strong>EXIT语句</strong>则直接终止循环。</p>
<pre class="brush: abap;">

WHILE  J > 3.

  IF SY-SUBRC <>0.

    EXIT.

  ENDIF.

ENDWHILE.

</pre>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>3.4.5 <span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/check" title="查看CHECK中的全部文章" target="_blank">CHECK</a></span></b><b>语句</b></p>
<p><strong><span class='wp_keywordlink_affiliate'><a href="http://www.sapjx.com/tag/check" title="查看CHECK中的全部文章" target="_blank">CHECK</a></span>语句</strong> 与 <strong>IF语句</strong>相似，区别在于 <strong>CHECK</strong> 只能做一次判断，且没有分支。</p>
<p>所以 <strong>CHECK</strong> 多用于执行结果或者循环中的条件判断：</p>
<pre class="brush: abap;">
DO 10 TIMES.

  CHECK SY-INDEX <= 4. 
  WRITE : / SY-INDEX.

ENDDO.

</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>最后，展示下通过用控制语句输出 <strong>乘法口诀表</strong> 的实例：</p>
<pre class="brush: abap;">

DATA x TYPE I.
DATA y TYPE I.
DATA z TYPE I

DATA xc(2) TYPE C .
DATA yc(2) TYPE C .
DATA zc(2) TYPE C .

x = 0 .
y = 0 .

DO 9 TIMES.
  WRITE / .
  x = x + 1 .
  y = 0 .

  DO 9 TIMES.
    y = y + 1 .
    z = x * y .

    xc = x .
    yc = y .
    zc = z .

    WRITE : xc  ,
            'X'  ,
            yc  ,
            '='  ,
            zc  ,
            ',' .
  ENDDO.

ENDDO.

</pre>
<p>&nbsp;</p>
<p>执行结果:</p>
<p><img src="http://www.sapjx.com/wp-content/uploads/2014/03/abap_06_Control_Statement_Demo.png" alt="abap_06_Control_Statement_Demo" width="1093" height="293" class="alignnone size-full wp-image-246" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>